//游戏控制器 控制其余所有类

//引入所有的类
import Snake from './Snake';
import Food from './Food';
import ScorePanel from './ScorePanel';
class GameControl {
    //定义三个属性
    //蛇
    snake: Snake;
    //食物
    food: Food;
    //计分牌
    scorePanel: ScorePanel;

    //创建一个属性来存储蛇的移动方向(也就是按键的方向)
    direction: string = ''

    //创建一个属性用来记录游戏是否结束
    isLive = true;

    constructor() {
        this.snake = new Snake()
        this.food = new Food()
        this.scorePanel = new ScorePanel()
    }

    //游戏的初始化方法 调用后游戏即开始
    init() {
        //绑定键盘按下的事件
        document.addEventListener('keydown', this.keydownHandler.bind(this))
        //调用run()方法 使蛇移动
        this.run();
    }
    //创建键盘按下的一个响应函数
    keydownHandler(event: KeyboardEvent) {
        // ArrowUp ArrowDown ArrowLeft ArrowRight Up Down Left Right

        //需要检查event.key的值合法(用户是否按了正确的按键)

        //修改direction属性
        this.direction = event.key
    }

    //创建一个控制移动的方法
    run() {
        //根据方向(this.direction)来使蛇的位置改变
        //向上 top减
        //向下 top加
        //向左 left减
        //向右 right加

        //获取蛇现在的坐标
        let X = this.snake.X
        let Y = this.snake.Y

        //根据按键的方向来修改X和Y值
        switch (this.direction) {
            case "ArrowUp":
            case "up":
                //向上移动 top减少
                Y -= 10;
                break;
            case "ArrowDown":
            case "Down":
                Y += 10;
                break;
            case "ArrowLeft":
            case "Left":
                X -= 10;
                break;
            case "ArrowRight":
            case "Right":
                X += 10;
                break;
        }
        //检查蛇是否吃到了食物
        this.checkEat(X, Y)

        //修改蛇的X和Y
        try {
            this.snake.X = X;
            this.snake.Y = Y;
        } catch (e) {
            //进入到catch 说明出现了异常，游戏结束，弹出了一个提示信息
            alert((e as Error).message + "GAME OVER!");
            //让游戏停止
            this.isLive = false;
        }

        //开启一个定时器
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30);
    }

    //定义一个方法，用来检查蛇是否吃到食物
    checkEat(X: number, Y: number) {
        if (X === this.food.X && Y === this.food.Y) {
            //食物的位置重置
            this.food.change()
            //分数增加
            this.scorePanel.addScore()
            //蛇的长度增加
            this.snake.addBody()
        }

    }


}
export default GameControl;